/*
 * Copyright (c) Shenzhen 7th Road Technical Co., Ltd
 * Technical Support dept.
 * http://www.7road.com
 */
package sz7thrd.ts.framework;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.concurrent.Executors;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * @author able
 * @date 2011-11-9
 * ===============================
 * 
 * 
 */
public class TimeServer {

	private static final int PORT = 9123;//定义监听端口 

	public static void main(String[] args) {

		// 服务器端的主要对象
		NioSocketAcceptor acceptor = new NioSocketAcceptor(5);
		//建立线程池   
		java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);
		//加入过滤器（Filter）到Acceptor   
		acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
		// 设置Filter链 
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
		// 协议解析，采用mina现成的UTF-8字符串处理方式
		acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		//acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new WebDecoder()，new WebEncoder()));
		//设置的是主服务监听的端口可以重用  
		acceptor.setReuseAddress(true);
		//设置每一个非主监听连接的端口可以重用   
		acceptor.getSessionConfig().setReuseAddress(true);
		//设置输入缓冲区的大小   
		acceptor.getSessionConfig().setReceiveBufferSize(1024);
		//设置输出缓冲区的大小 
		acceptor.getSessionConfig().setSendBufferSize(10240);
		//设置为非延迟发送，为true则不组装成大包发送，收到东西马上发出   
		acceptor.getSessionConfig().setTcpNoDelay(true);
		// 设置接收缓存区大小
		acceptor.getSessionConfig().setReadBufferSize(2048);
		// 读写通道10秒内无操作进入空闲状态
		acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
		//设置主服务监听端口的监听队列的最大值为100，如果当前已经有100个连接，再新的连接来将被服务器拒绝   
		acceptor.setBacklog(100);
		acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));

		// 设置消息处理类（创建、关闭Session，可读可写等等，继承自接口IoHandler）
		// 指定业务逻辑处理器 
		acceptor.setHandler(new TimeServerHandler());

		try {
			// 服务器开始监听
			acceptor.bind();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
